const path=require('path')
const grpc=require('@grpc/grpc-js')
// 引入 @grpc/proto-loader 模块，该模块用于加载 .proto 文件并将其转换为 JavaScript 对象
const protoLoader=require('@grpc/proto-loader');

// 使用 path.join 方法构建 .proto 文件的完整路径
// __dirname 是 Node.js 中的一个全局变量，表示当前执行脚本所在的目录
// 'message.proto' 是要加载的 .proto 文件的文件名
const PROTO_PATH = path.join(__dirname, 'message.proto');

// 使用 protoLoader.loadSync 方法同步加载 .proto 文件
// 第二个参数是一个配置对象，用于指定加载过程中的一些选项：
// keepCase: true 表示保持字段名的原始大小写，不进行驼峰转换
// longs: String 表示将 Protobuf 中的 long 类型转换为 JavaScript 的字符串类型
// enums: String 表示将 Protobuf 中的枚举类型转换为 JavaScript 的字符串类型
// defaults: true 表示为缺失的字段设置默认值
// oneofs: true 表示支持 Protobuf 中的 oneof 字段
const packageDefinition = protoLoader.loadSync(PROTO_PATH, { 
    keepCase: true, 
    longs: String, 
    enums: String, 
    defaults: true, 
    oneofs: true 
});

// 使用 grpc.loadPackageDefinition 方法将加载的包定义转换为 gRPC 可以使用的服务和消息定义
// 该方法返回一个包含所有服务和消息定义的对象
const protoDescriptor =grpc.loadPackageDefinition(packageDefinition);


// 从 protoDescriptor 对象中提取名为 'message' 的包定义
// 这里假设 .proto 文件中定义了一个名为 'message' 的包
const message_proto = protoDescriptor.message;

// 将提取的 message_proto 对象导出，以便其他模块可以使用
// 其他模块可以通过 require 语句引入该模块并使用其中定义的服务和消息
module.exports = message_proto;